package sicnu.cs.aps.service;


import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
import sicnu.cs.aps.domain.entity.User;

import java.util.List;
import java.util.Set;

public interface IUserService {

    /**
     * 注册用户
     * @param user 用户信息
     * @param targetRole 角色信息
     */
    @Transactional(rollbackFor = RuntimeException.class)
    void registUser(User user, String targetRole);

    /**
     * 用户名是否存在
     *
     * @param username 用户名
     * @return 是否存在
     */
    boolean isUsernameExisted(String username);

    /**
     * 邮箱是否存在
     *
     * @param email 邮箱
     * @return 是否存在
     */
    boolean isEmailExisted(String email);

    /**
     * 手机号是否存在
     *
     * @param mobile 手机号
     * @return 是否存在
     */
    boolean isMobileExisted(String mobile);

    /**
     * 该用户id是否存在
     *
     * @param id 用户id
     * @return 是否存在
     */
    boolean isUserIdExisted(Long id);


    /**
     * 重置用户密码
     *
     * @param password 新密码
     * @param id       用户id
     */
    boolean resetPassword(Long id, String password);

    /**
     * 查找用户
     *
     * @param email 邮箱地址
     * @return 用户
     */
    User findUserByEmail(String email);

    /**
     * 查找用户
     *
     * @param userId 主键
     * @return 用户
     */
    User findUser(Long userId);

    /**
     * 更新用户邮箱
     *
     * @param userId 用户id
     * @param email  新邮箱
     * @return 是否修改成功
     */
    boolean updateEmail(Long userId, String email);

    /**
     * 根据用户id查找密码
     *
     * @param userId 用户id
     * @return 密码
     */
    String findPassword(Long userId);

    /**
     * 用户导入服务
     *
     * @param file 文件流
     * @param type 导入用户类型
     * @return 错误行行标，如果返回null则导入无误
     * @throws Exception 错误信息
     */
    List<String> importUser(MultipartFile file, Integer type) throws Exception;

    /**
     * 获取当前用户的学院信息
     *
     * @return 学院id
     */
    Long getCollegeIdByUserId();

    /**
     * 获取指定用户的学院信息
     *
     * @param id 指定的用户id
     * @return 学院id
     */
    Long getCollegeIdByUserId(Long id);


    List<User> listById(List<Long> studentIds);
}
